void main() {
//  print('hello world');
//
//  // 1.整数类型int
//  int age = 20;
//  int hexAge = 0x20;
//  print(age);
//  print(hexAge);
//
//  // 2.浮点类型double
//  double height = 3.1415;
//  print(height);
//
//  // 字符串和数字转化
//  // 1.字符串转数字
//  var one = int.parse('100');
//  var two = double.parse('20.54');
//  print('${one} ${one.runtimeType}'); // 111 int
//  print('${two} ${two.runtimeType}'); // 12.22 double
//
//  // 2.数字转字符串
//  var num1 = 100;
//  var num2 = 20.256;
//  var num1Str = num1.toString();
//  var num2Str = num2.toString();
//  var num2StrD = num2.toStringAsFixed(2); // 保留两位小数
//  print('${num1Str} ${num1Str.runtimeType}'); // 100 String
//  print('${num2Str} ${num2Str.runtimeType}'); // 20.256 String
//  print('${num2StrD} ${num2StrD.runtimeType}'); // 20.26 String
//
//  // 布尔类型
//  var isFlag = true;
//  print('$isFlag ${isFlag.runtimeType}');
//  // isFlag.runtimeType对象类型
//  print(bool == isFlag.runtimeType); // true
//  print('bool' == isFlag.runtimeType); // false
//
//  // 1.定义字符串的方式
//  var s1 = 'Hello World';
//  var s2 = "Hello Dart";
//  var s3 = 'Hello\'Fullter';
//  var s4 = "Hello'Fullter";
//  print(s1);
//  print(s2);
//  print(s3);
//  print(s4);
//  // 2.表示多行字符串的方式
//  var message1 = '''
//    你你你
//    急急急
//    分分分''';
//  print(message1);

//  // 3.拼接其他变量
//  var name = '阿尔法';
//  var age = 40;
//  var height = 1.22;
//  print('my name is ${name}, age is $age, height is $height');
//
//  // List定义
//  // 1.使用类型推导定义
//  var letters = ['a', 'b', 'c', 'd'];
//  print('$letters ${letters.runtimeType}');
//  // 2.明确指定类型
//  List<int> numbers = [1, 2, 3, 4];
//  print('$numbers ${numbers.runtimeType}');
//
//  // Set的定义
//  // 1.使用类型推导定义
//  var lettersSet = {'a', 'b', 'c', 'd'};
//  print('$lettersSet ${lettersSet.runtimeType}');
//
//  // 2.明确指定类型
//  Set<int> numbersSet = {1, 2, 3, 4};
//  print('$numbersSet ${numbersSet.runtimeType}');
//
//  // Map的定义
//  // 1.使用类型推导定义
//  var infoMap1 = {'name': 'why', 'age': 18};
//  print('$infoMap1 ${infoMap1.runtimeType}');
//
//  // 2.明确指定类型
//  Map<String, Object> infoMap2 = {'height': 1.88, 'address': '北京市'};
//  print('$infoMap2 ${infoMap2.runtimeType}');

//  //获取数组的长度
//  List aaa = [1, 2, 3, 4, 5, 6];
//  print(aaa.length);
//
//  //获取Set的元素个数
//  Set bbb = {1, 2, 3, 4, 5, 5, 5, 5};
//  print(bbb.length); //打印结果5;
//  //因为bbb是Set类型,不允许有重复元素,系统会自动取出重复元素;
//
//  //获取字典的键:值 对数
//  Map ccc = {'key1': 1, 'key2': 'value2', 'key3': false};
//  print(ccc);
//  print(ccc.length);

//  // 集合添加/删除
//  // List
//  List aaa = [1, 2, 3, 4, 5, 6];
//  aaa.add(7); // [1, 2, 3, 4, 5, 6, 7]
//  aaa.insert(3, 8); //[1, 2, 3, 8, 4, 5, 6, 7]
//  aaa.remove(1); //[2, 3, 8, 4, 5, 6, 7]
//  var index = aaa.indexOf(3); //3的index值是1;
//  var value = aaa.elementAt(1); //aaa的index = 1 的值是 3;
//
//  //Set
//  Set bbb = {1, 2, 3, 4, 5};
//  bbb.remove(1);
//  bbb.add(6);
//
//  //Map
//  Map ccc = {'key1': 1, 'key2': 111, 'key3': false};
//  ccc['key4'] = 'test';
//  print(ccc); //{key1: 1, key2: value2, key3: false, key4: test}
//  ccc.remove('key1');
//  print(ccc); //{key2: value2, key3: false, key4: test}
//  print(ccc.keys); //(key2, key3, key4)
//  print(ccc.values); //(value2, false, test)
//  print('${ccc.containsKey('key5')} ${ccc.containsValue(111)}'); // false true
//  print(ccc.entries); //(MapEntry(key2: value2), MapEntry(key3: false), MapEntry(key4: test))

//  testObject();
  meiju();
}

//这个方法运行时会报错,但是编译器编译不报错;
void testDynamic() {
  //dynamic 编译时不会揣测数据类型，但是运行时会推断
  dynamic s1 = 'string';
  dynamic a1 = 1;
  var result = s1 + a1;
  print(s1.runtimeType);
  print(result);

  //上面这个代码编译时不会报错,但是运行时会报错;
  //运行时报错内容:type 'int' is not a subtype of type 'String' of 'other'

  //我们在来看一个:
  s1.findbyid();
  //s1这个实例,并没有包含findbyid();这个方法,但是调用的时候,编译器并不报错;
  //运行时就会报错,提示没有找到这个方法;
}

// Object 在运行时是有类型推断的
void testObject() {
//  //Object
//  Object object = "hello world";
//  print(object.runtimeType); //String
//  print(object); //hello world
//
//
//  Object object2 = 1;
//  var result = object + object2;
//  //编译器会推断出这个类型不一致,直接报错
//
//  print(object.runtimeType); //int 说明类型是可变的
//  print(object); //1
//  //object.foo();静态类型检查会运行报错会报错
}

// 枚举类型
meiju() {
  final s = Season.winter;

  //使用switch分支语法,对枚举进行判断
  switch (s) {
    case Season.spring:
      print('s 是春天');
      break;
    case Season.summer:
      print('s 是夏天');
      break;
    case Season.autumn:
      print('s 是秋天');
      break;
    case Season.winter:
      print('s 是冬天');
      break;
    default:
      print('啥也不是');
  }
}
//定义一个枚举类型;
enum Season { spring, summer, autumn, winter }